// Copyright (C) 2016 Michael Ficarra. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-object-initializer-runtime-semantics-propertydefinitionevaluation
description: >
    Evaluation of PropertyDefinitionList occurs in order, and each
    PropertyDefinition's PropertyName is evaluated before its
    AssignmentExpression.
---*/

function Test() {
    var counter = 0;
    var o = {
      [++counter]: ++counter,
      [++counter]: ++counter,
      [++counter]: ++counter,
    }

    var keys = Object.getOwnPropertyNames(o);

    assert.sameValue(keys.length, 3, '3 PropertyDefinitions should result in 3 properties');
    assert.sameValue(keys[0], '1');
    assert.sameValue(o[keys[0]], 2);
    assert.sameValue(keys[1], '3');
    assert.sameValue(o[keys[1]], 4);
    assert.sameValue(keys[2], '5');
    assert.sameValue(o[keys[2]], 6);
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
